package com.nuorui.module.system.manager;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.nuorui.common.core.enums.ConfigKeyEnum;
import com.nuorui.common.utils.SmartBeanUtil;
import com.nuorui.module.system.mapper.ConfigMapper;
import com.nuorui.module.system.domain.entity.ConfigEntity;
import com.nuorui.module.system.domain.vo.ConfigVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 系统配置
 *
 * @author: Fred
 * @email 453086@qq.com
 * @create: 2025-06-11 20:45
 */
@Slf4j
@Service
public class ConfigManager {

    /**
     * 系统配置缓存
     */
    private final ConcurrentHashMap<String, ConfigEntity> configCache = new ConcurrentHashMap<>();

    @Resource
    private ConfigMapper configDao;

    /**
     * 初始化系统设置缓存
     */
    @PostConstruct
    private void loadConfigCache() {
        configCache.clear();
        List<ConfigEntity> entityList = configDao.selectList(Wrappers.lambdaQuery());
        if (CollectionUtil.isEmpty(entityList)) {
            return;
        }
        entityList.forEach(entity -> configCache.put(normalizeKey(entity.getConfigKey()), entity));
        log.info("################# 系统配置缓存初始化完毕:{} ###################", configCache.size());
    }

    /**
     * 刷新单个配置项缓存
     */
    public void refreshConfigCache(Long configId) {
        ConfigEntity configEntity = configDao.selectById(configId);
        if (configEntity != null) {
            configCache.put(normalizeKey(configEntity.getConfigKey()), configEntity);
        }
    }

    /**
     * 查询配置对象（枚举方式）
     */
    public ConfigVO getConfig(ConfigKeyEnum configKey) {
        return getConfig(configKey.getValue());
    }

    /**
     * 查询配置对象（字符串 key）
     */
    public ConfigVO getConfig(String configKey) {
        if (StrUtil.isBlank(configKey)) {
            return null;
        }

        String normalizedKey = normalizeKey(configKey);
        ConfigEntity entity = configCache.get(normalizedKey);

        if (entity == null) {
            entity = configDao.selectByKey(configKey);
            if (entity != null) {
                configCache.put(normalizedKey, entity);
            }
        }
        return entity == null ? null : SmartBeanUtil.copy(entity, ConfigVO.class);
    }

    public void removeConfigCache(String configKey) {
        if (StrUtil.isNotBlank(configKey)) {
            configCache.remove(normalizeKey(configKey));
        }
    }

    private String normalizeKey(String key) {
        return key == null ? null : key.toLowerCase();
    }
}
